import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib.colors import ListedColormap
import numpy as np

def create_bmi_chart(bmi_data):
    #bmi图表
    fig, ax = plt.subplots(figsize=(10, 6))
    ax.pie(bmi_data.values(), labels=bmi_data.keys(), autopct='%1.1f%%')
    ax.set_title('NBA运动员BMI分布')
    return fig

def create_birth_year_chart(year_data):
    #创建出生年份图表
    fig, ax = plt.subplots(figsize=(12, 6))
    x_axis_data = list(year_data.keys())
    y_axis_data = list(year_data.values())
    
    for x, y in zip(x_axis_data, y_axis_data):
        ax.text(x, y + 0.3, f'{y:.0f}', ha='center', va='bottom', fontsize=7.5)
    
    ax.plot(x_axis_data, y_axis_data, 'b*--', alpha=0.5, linewidth=1, label='birth year')
    ax.legend()
    ax.set_xlabel("year")
    ax.set_ylabel("birth num")
    ax.set_title('NBA运动员出生年份分布')
    return fig

def create_birth_state_chart(state_data):
    #创建出生州图表
    fig, ax = plt.subplots(figsize=(10, 6))
    ax.pie(state_data.values(), labels=state_data.keys(), autopct='%1.1f%%')
    ax.set_title('NBA运动员出生州分布')
    return fig

def create_height_BLK_chart(data) :
    fig, ax = plt.subplots(figsize=(10, 6))
    sns.scatterplot(
        x='height', 
        y='BLK%', 
        data=data, 
        alpha=0.7,  # 点的透明度
        s=80,       # 点的大小
        color='teal'  # 点的颜色
    )
    # 添加趋势线（展示整体相关性趋势）
    sns.regplot(
        x='height', 
        y='BLK%', 
        data=data, 
        scatter=False,  # 不显示散点（避免重复）
        color='crimson',  # 趋势线颜色
        line_kws={"lw": 2}  # 线的粗细
    )
    # 计算相关系数（皮尔逊相关系数）
    correlation = data['height'].corr(data['BLK%'])
    # 添加图表标题和标签
    plt.title(f'身高与盖帽率（BLK%）的相关性分析\n相关系数: {correlation:.2f}', fontsize=15, pad=20 )
    plt.xlabel('身高', fontsize=12, labelpad=10)
    plt.ylabel('盖帽率（BLK%）', fontsize=12, labelpad=10)
    # 添加网格线
    plt.grid(linestyle='--', alpha=0.6)
    # 调整布局
    plt.tight_layout()
    return fig

def create_ows_dws_cluster_chart(data_with_clusters, cluster_centers):
    """
    创建OWS和DWS聚类分析图表
    参数:
    data_with_clusters: 包含聚类标签的数据
    cluster_centers: 聚类中心数据
    返回:
    matplotlib.figure.Figure 对象
    """
    # 创建颜色映射
    colors = ['#FF6B6B', '#4ECDC4', '#45B7D1', '#F9A602', '#9B59B6', '#2ECC71']
    n_clusters = len(cluster_centers)
    cmap = ListedColormap(colors[:n_clusters])
    
    fig, ax = plt.subplots(figsize=(10,10))
    
    # 绘制散点图，按聚类着色
    scatter = ax.scatter(
        data_with_clusters['OWS'],
        data_with_clusters['DWS'],
        c=data_with_clusters['cluster'],
        cmap=cmap,
        alpha=0.7,
        s=80,
        edgecolors='w',
        linewidth=0.5
    )
    
    # 绘制聚类中心
    ax.scatter(
        cluster_centers['OWS'],
        cluster_centers['DWS'],
        c=range(n_clusters),
        cmap=cmap,
        marker='X',
        s=200,
        edgecolors='black',
        linewidth=2,
        label='聚类中心'
    )
    
    # 添加坐标轴参考线
    ax.axhline(y=0, color='gray', linestyle='--', alpha=0.7)
    ax.axvline(x=0, color='gray', linestyle='--', alpha=0.7)
    
    # 添加图表标题和标签
    ax.set_title('NBA球员OWS和DWS的聚类分析', fontsize=16, fontweight='bold', pad=20)
    ax.set_xlabel('进攻胜利贡献值 (OWS)', fontsize=12, labelpad=10)
    ax.set_ylabel('防守胜利贡献值 (DWS)', fontsize=12, labelpad=10)
    
    # 添加图例
    legend_elements = []
    for i, center in cluster_centers.iterrows():
        legend_elements.append(plt.Line2D(
            [0], [0], 
            marker='o', 
            color='w', 
            markerfacecolor=colors[i],
            markersize=10,
            label=f'聚类 {i} ({center["description"]}): OWS={center["OWS"]:.2f}, DWS={center["DWS"]:.2f}'
        ))
    
    ax.legend(handles=legend_elements, loc='upper left', bbox_to_anchor=(1, 1))
    
    # 添加网格
    ax.grid(True, linestyle='--', alpha=0.7)
    
    # 添加四象限标注
    ax.text(0.02, 0.98, '防守专精', transform=ax.transAxes, fontsize=10, 
            verticalalignment='top', bbox=dict(boxstyle='round', facecolor='white', alpha=0.8))
    ax.text(0.02, 0.02, '待发展', transform=ax.transAxes, fontsize=10, 
            verticalalignment='bottom', bbox=dict(boxstyle='round', facecolor='white', alpha=0.8))
    ax.text(0.98, 0.98, '攻守兼备', transform=ax.transAxes, fontsize=10, 
            verticalalignment='top', horizontalalignment='right',
            bbox=dict(boxstyle='round', facecolor='white', alpha=0.8))
    ax.text(0.98, 0.02, '进攻专精', transform=ax.transAxes, fontsize=10, 
            verticalalignment='bottom', horizontalalignment='right',
            bbox=dict(boxstyle='round', facecolor='white', alpha=0.8))
    
    # 调整布局
    plt.tight_layout()
    
    return fig

def create_weight_TRB_chart(data):
    fig, ax = plt.subplots(figsize=(10, 6))
    sns.scatterplot(x='weight', y='TRB%', data=data,alpha=0.6,s=80,color='royalblue',edgecolor='white',linewidth=0.5)
    # 添加趋势线
    sns.regplot(x='weight', y='TRB%', data=data,scatter=False,color='darkorange', line_kws={"lw": 2.5, "linestyle": "-."})
    # 计算相关系数
    correlation = data['weight'].corr(data['TRB%'])
    plt.title(f'体重与总篮板率（TRB%）的相关性分析\n相关系数: {correlation:.2f}',fontsize=15,pad=20 )
    plt.xlabel('体重', fontsize=12, labelpad=10)
    plt.ylabel('总篮板率（TRB%）', fontsize=12, labelpad=10)
    plt.tight_layout()
    print(f"体重与总篮板率的相关系数：{correlation:.4f}")
    return fig

def create_PTS_chart(data):
    fig, ax = plt.subplots(figsize=(12, 6))
    ax = sns.histplot(data, kde=True, color='skyblue')
    
    for p in ax.patches:
        height = p.get_height()
        if height > 0:  
            ax.text(p.get_x() + p.get_width() / 2., height + 0.1,
                    f'{int(height)}', ha='center', va='bottom', fontsize=10)
    
    plt.title('球员得分分布直方图')
    plt.xlabel('得分(PTS)')
    plt.ylabel('数量')
    plt.tight_layout()  
    return fig

def create_height_TRB_chart(data):
    fig, ax = plt.subplots(figsize=(10, 6))
    sns.scatterplot(x='height', y='TRB%', data=data,alpha=0.6,s=80,color='royalblue',edgecolor='white',linewidth=0.5)
    # 添加趋势线
    sns.regplot(x='height', y='TRB%', data=data,scatter=False,color='darkorange', line_kws={"lw": 2.5, "linestyle": "-."})
    # 计算相关系数
    correlation = data['height'].corr(data['TRB%'])
    plt.title(f'身高与总篮板率（TRB%）的相关性分析\n相关系数: {correlation:.2f}',fontsize=15,pad=20 )
    plt.xlabel('身高', fontsize=12, labelpad=10)
    plt.ylabel('总篮板率（TRB%）', fontsize=12, labelpad=10)
    plt.tight_layout()
    print(f"身高与总篮板率的相关系数：{correlation:.4f}")
    return fig

def create_bmi_TRB_chart(data):
    fig, ax = plt.subplots(figsize=(10, 6))
    sns.scatterplot(x='bmi', y='TRB%', data=data,alpha=0.6,s=80,color='royalblue',edgecolor='white',linewidth=0.5)
    # 添加趋势线
    sns.regplot(x='bmi', y='TRB%', data=data,scatter=False,color='darkorange', line_kws={"lw": 2.5, "linestyle": "-."})
    # 计算相关系数
    correlation = data['bmi'].corr(data['TRB%'])
    plt.title(f'bmi与总篮板率（TRB%）的相关性分析\n相关系数: {correlation:.2f}',fontsize=15,pad=20 )
    plt.xlabel('bmi', fontsize=12, labelpad=10)
    plt.ylabel('总篮板率（TRB%）', fontsize=12, labelpad=10)
    plt.tight_layout()
    print(f"bmi与总篮板率的相关系数：{correlation:.4f}")
    return fig

def create_position_radar_chart(position_stats, stats_columns, position):
    stats = position_stats[position]
    values = [stats[col] for col in stats_columns]
    
    N = len(stats_columns)
    angles = [n / float(N) * 2 * np.pi for n in range(N)]
    angles += angles[:1]  
    values += values[:1]  
    
    fig, ax = plt.subplots(figsize=(10, 10), subplot_kw=dict(polar=True))
    
    # 绘制雷达图
    ax.plot(angles, values, linewidth=2, linestyle='solid', color='blue')
    ax.fill(angles, values, color='blue', alpha=0.25)
    
    # 设置每个维度的标签
    ax.set_xticks(angles[:-1])
    ax.set_xticklabels(stats_columns)
    
    # 设置y轴刻度（0到1）
    ax.set_ylim(0, 1)
    ax.set_yticks([0, 0.2, 0.4, 0.6, 0.8, 1])
    ax.set_yticklabels(["0", "0.2", "0.4", "0.6", "0.8", "1"])
    
    # 添加标题
    plt.title(f'{position}位置球员平均水平雷达图', size=20, y=1.1)
    
    # 添加网格
    ax.grid(True)
    
    return fig